package Prac;

public class P11_24 {

    //给定一个已排序的链表的头 head ， 删除所有重复的元素，使每个元素只出现一次 。返回 已排序的链表 。
    public ListNode deleteDuplicates1(ListNode head) {
        if(head==null){
            return null;
        }
        ListNode prev = head;
        ListNode cur = prev.next;
        while(cur!=null){
            if(prev.val==cur.val){
                prev.next=cur.next;
                cur.next=null;
            }else{
                prev=cur;
            }
            cur = prev.next;
        }
        return head;
    }

    //给定一个已排序的链表的头 head ， 删除原始链表中所有重复数字的节点，只留下不同的数字 。返回 已排序的链表 。

    public ListNode deleteDuplicates2(ListNode head) {
        if(head==null||head.next==null){//只有一个或者没有节点
            return head;
        }
        //至少有两个节点
        ListNode dummyHead = new ListNode(-101);//虚拟头节点
        dummyHead.next = head;
        ListNode prev = dummyHead;//cur的前驱
        // cur与sec是两个对比的节点
        ListNode cur = prev.next;
        ListNode sec = cur.next;
        while(sec!=null){
            if(cur.val==sec.val){//如果cur.val==sec.val
                while(sec!=null&&cur.val==sec.val){//直接跳到cur.val!=sec.val的位置
                    sec=sec.next;
                }
                prev.next=sec;//prev.next==cur==sec,相同的节点已经删除
                if(sec!=null){//说明后面还有节点可以比较
                    //prev.next==cur==sec
                    //prev,cur,sec保持相对位置
                    cur = prev.next;
                    sec = cur.next;
                }
            }else{//cur.val!=sec.val prev,cur,sec保持相对位置向后移动
                prev =prev.next;
                cur = cur.next;
                sec = sec.next;
            }
        }
        return dummyHead.next;
    }

    public ListNode deleteDuplicates(ListNode head) {
        if(head==null||head.next==null){
            return head;
        }
        ListNode dummyHead = new ListNode(-101);
        dummyHead.next = head;
        ListNode prev = dummyHead, cur = prev.next;
        while (cur!=null){
            ListNode sec = cur.next;
            if(sec==null){
                break;
            }
            if(cur.val!=sec.val){
                prev = prev.next;
            }else {
                while (sec!=null&&cur.val==sec.val){
                    sec = sec.next;
                }
                prev.next = sec;
            }
            cur = prev.next;
        }
        return dummyHead.next;
    }

}
